package com.java.base.array;

/**
 * <h2>数组</h2>
 * 是将元素在内存中连续存放，由于每个元素占用内存相同，可以通过下标迅速访问数组中任何元素。
 * 但是如果要在数组中增加一个元素，需要移动大量元素，在内存中空出一个元素的空间，然后将要
 * 增加的元素放在其中。同样的道理，如果想删除一个元素，同样需要移动大量元素去填掉被移动的
 * 元素。如果应用需要快速访问数据，很少插入和删除元素，就应该用数组。
 *
 * <h2>链表</h2>
 * <p>
 * 中的元素在内存中不是顺序存储的，而是通过存在元素中的指针联系到一起，每个结点包括两
 * 个部分：一个是存储 数据元素 的　数据域，另一个是存储下一个结点地址的 指针。
 * <p>
 * 如果要访问链表中一个元素，需要从第一个元素开始，一直找到需要的元素位置。但是增加和删除一
 * 个元素对于链表数据结构就非常简单了，只要修改元素中的指针就可以了。如果应用需要经常插入和
 * 删除元素你就需要用链表。
 *
 * <h2>内存存储区别</h2>
 * <ul>
 * <li>数组从栈中分配空间, 对于程序员方便快速,但自由度小。</li>
 * <li>链表从堆中分配空间, 自由度大但申请管理比较麻烦.</li>
 * </ul>
 * <h2>逻辑结构区别</h2>
 * <ul>
 * <li>数组必须事先定义<b>固定的长度（元素个数）</b>，不能适应数据动态地增减的情况。当数据增加时，可能超出原先定义的元素个数；当数据减少时，造成内存浪费。　</li>
 * <li>链表动态地进行存储分配，可以适应数据动态地增减的情况，且可以方便地插入、删除数据项。（数组中插入、删除数据项时，需要移动其它数据项）　</li>
 * </ul>
 * <h2>总结</h2>
 * <ol>
 * <li>存取方式上，数组可以顺序存取或者随机存取，而链表只能顺序存取；</li>
 * <li>存储位置上，数组逻辑上相邻的元素在物理存储位置上也相邻，而链表不一定；</li>
 * <li>存储空间上，链表由于带有指针域，存储密度不如数组大；</li>
 * <li>按序号查找时，数组可以随机访问，时间复杂度为O(1)，而链表不支持随机访问，平均需要O(n)；</li>
 * <li>按值查找时，若数组无序，数组和链表时间复杂度均为O(1)，但是当数组有序时，可以采用折半查找将时间复杂度降为O(logn)；</li>
 * <li>插入和删除时，数组平均需要移动n/2个元素，而链表只需修改指针即可；</li>
 * <li>空间分配方面：
 * 　　数组在静态存储分配情形下，存储元素数量受限制，动态存储分配情形下，虽然存储空间可以扩充，但需要移动大量元素，导致操作效率降低，而且如果内存中没有更大块连续存储空间将导致分配失败；
 * 　　链表存储的节点空间只在需要的时候申请分配，只要内存中有空间就可以分配，操作比较灵活高效；</li>
 * </ol>
 *
 * @author xuweizhi
 * @date 2019/03/17 16:22
 */
public class LinkAnalysis {

}
